package com.zzw.springboot.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.zzw.springboot.bean.Inventory;
import com.zzw.springboot.bean.StockChange;
import com.zzw.springboot.bean.SysUser;

import java.util.List;

/**
 * 库存服务接口
 */
public interface InventoryService extends IService<Inventory> {
    /**
     * 查询库存列表
     * @param inventory 查询条件
     * @return 库存列表
     */
    List<Inventory> getInventoryList(Inventory inventory);

    /**
     * 查询预警库存列表
     * @return 预警库存列表
     */
    List<Inventory> getAlertList();

    /**
     * 查询指定商品的库存信息
     * @param productId 商品ID
     * @param warehouseId 仓库ID
     * @return 库存信息
     */
    Inventory getInventoryByProductAndWarehouse(Integer productId, Integer warehouseId);

    /**
     * 设置库存预警阈值
     * @param productId 商品ID
     * @param warehouseId 仓库ID
     * @param alertThreshold 预警阈值
     * @return 是否成功
     */
    boolean setAlertThreshold(Integer productId, Integer warehouseId, Integer alertThreshold);

    /**
     * 入库操作
     * @param productId 商品ID
     * @param warehouseId 仓库ID
     * @param quantity 入库数量
     * @param operatorId 操作人ID
     * @param relatedId 关联单据ID
     * @param relatedType 关联单据类型
     * @param remark 备注
     * @return 是否成功
     */
    boolean stockIn(Integer productId, Integer warehouseId, Integer quantity, Integer operatorId,
                   Integer relatedId, Integer relatedType, String remark);

    /**
     * 出库操作
     * @param productId 商品ID
     * @param warehouseId 仓库ID
     * @param quantity 出库数量
     * @param operatorId 操作人ID
     * @param relatedId 关联单据ID
     * @param relatedType 关联单据类型
     * @param remark 备注
     * @return 是否成功
     */
    boolean stockOut(Integer productId, Integer warehouseId, Integer quantity, Integer operatorId,
                    Integer relatedId, Integer relatedType, String remark);

    /**
     * 库存调整（盘盈盘亏）
     * @param productId 商品ID
     * @param warehouseId 仓库ID
     * @param adjustQuantity 调整数量（正数为盘盈，负数为盘亏）
     * @param operatorId 操作人ID
     * @param relatedId 关联单据ID
     * @param relatedType 关联单据类型
     * @param remark 备注
     * @return 是否成功
     */
    boolean adjustStock(Integer productId, Integer warehouseId, Integer adjustQuantity, Integer operatorId,
                       Integer relatedId, Integer relatedType, String remark);

    /**
     * 锁定库存
     * @param productId 商品ID
     * @param warehouseId 仓库ID
     * @param quantity 锁定数量
     * @return 是否成功
     */
    boolean lockStock(Integer productId, Integer warehouseId, Integer quantity);

    /**
     * 解锁库存
     * @param productId 商品ID
     * @param warehouseId 仓库ID
     * @param quantity 解锁数量
     * @return 是否成功
     */
    boolean unlockStock(Integer productId, Integer warehouseId, Integer quantity);

    /**
     * 查询库存变动记录
     * @param stockChange 查询条件
     * @return 变动记录列表
     */
    List<StockChange> getStockChangeList(StockChange stockChange);

    /**
     * 根据商品ID查询库存变动记录
     * @param productId 商品ID
     * @return 变动记录列表
     */
    List<StockChange> getStockChangeByProductId(Integer productId);

    /**
     * 根据单据信息查询库存变动记录
     * @param relatedId 关联单据ID
     * @param relatedType 关联单据类型
     * @return 变动记录列表
     */
    List<StockChange> getStockChangeByRelated(Integer relatedId, Integer relatedType);
}
